package teste.dao;

import java.util.ArrayList;

import objetos.Usuario;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import dao.UsuarioDAO;

public class TestUsuarioDAO {

	private Usuario usuarioUm;
	private Usuario usuarioDois;
	private Usuario usuarioTres;
	private UsuarioDAO usuarioDAO;
	
	@Before
	public void setUp() throws Exception{
		this.usuarioUm = new Usuario("Usuario1", "UsuarioUm", "Endereco1");
		this.usuarioDois = new Usuario("Usuario2", "UsuarioDois", "Endereco2");
		this.usuarioTres = new Usuario("Usuario3", "UsuarioTres", "Endereco3");
		this.usuarioDAO = new UsuarioDAO();
	}
	
	@Test
	public void verificaCadastrar() throws Exception {
		this.usuarioDAO.cadastrar(this.usuarioUm);
		this.usuarioDAO.cadastrar(this.usuarioDois);
		this.usuarioDAO.cadastrar(this.usuarioTres);
		try{
			this.usuarioDAO.cadastrar(this.usuarioUm);
			Assert.fail("Vai entrar em excecao, porque o usuario ja estava cadastrado!");
		}
		catch(Exception e){
			Assert.assertEquals("Usuario ja estava cadastrado!", "Já existe um usuário com este login", e.getMessage());
		}
		
		try{
			this.usuarioDAO.cadastrar(this.usuarioDois);
			Assert.fail("Vai entrar em excecao, porque o usuario ja estava cadastrado!");
		}
		catch(Exception e){
			Assert.assertEquals("Usuario ja estava cadastrado!", "Já existe um usuário com este login", e.getMessage());
		}
		
		try{
			this.usuarioDAO.cadastrar(this.usuarioTres);
			Assert.fail("Vai entrar em excecao, porque o usuario ja estava cadastrado!");
		}
		catch(Exception e){
			Assert.assertEquals("Usuario ja estava cadastrado!", "Já existe um usuário com este login", e.getMessage());
		}
	}
	
	@Test
	public void verificaDeletarPesquisar() throws Exception{
		try{
			this.usuarioDAO.pesquisar(null, "Chave");
			Assert.fail("Vai entrar em excecao por causa do filtro nulo");
		}
		catch(Exception e){
			Assert.assertEquals("Filtro nulo", "Especifique o filtro e a chave da pesquisa.", e.getMessage());
		}
		
		try{
			this.usuarioDAO.pesquisar("", "Chave");
			Assert.fail("Vai entrar em excecao por causa do filtro vazio");
		}
		catch(Exception e){
			Assert.assertEquals("Filtro vazio", "Voce deve deve definir o filtro e a chave da pesquisa.", e.getMessage());
		}
		
		try{
			this.usuarioDAO.pesquisar("FiltroInexistente", "Chave");
			Assert.fail("Vai entrar em excecao por causa do filtro inexistente");
		}
		catch(Exception e){
			Assert.assertEquals("Filtro inexistente", "Atributo inexistente", e.getMessage());
		}
		
		try{
			this.usuarioDAO.pesquisar("nome", null);
			Assert.fail("Vai entrar em excecao por causa da chave nula");
		}
		catch(Exception e){
			Assert.assertEquals("Chave nula", "Especifique o filtro e a chave da pesquisa.", e.getMessage());
		}
		
		try{
			this.usuarioDAO.pesquisar("nome", "");
			Assert.fail("Vai entrar em excecao por causa da chave vazia");
		}
		catch(Exception e){
			Assert.assertEquals("Chave vazia", "Voce deve deve definir o filtro e a chave da pesquisa.", e.getMessage());
		}
		
		Assert.assertEquals(this.usuarioUm, this.usuarioDAO.pesquisar("nome", "UsuarioUm").get(0));
		Assert.assertEquals(this.usuarioUm, this.usuarioDAO.pesquisar("endereco", "Endereco1").get(0));
		Assert.assertEquals(this.usuarioUm, this.usuarioDAO.pesquisar("login", "Usuario1").get(0));
		Assert.assertEquals(this.usuarioDois, this.usuarioDAO.pesquisar("nome", "UsuarioDois").get(0));
		Assert.assertEquals(this.usuarioDois, this.usuarioDAO.pesquisar("endereco", "Endereco2").get(0));
		Assert.assertEquals(this.usuarioDois, this.usuarioDAO.pesquisar("login", "Usuario2").get(0));
		Assert.assertEquals(this.usuarioTres, this.usuarioDAO.pesquisar("nome", "UsuarioTres").get(0));
		Assert.assertEquals(this.usuarioTres, this.usuarioDAO.pesquisar("endereco", "Endereco3").get(0));
		Assert.assertEquals(this.usuarioTres, this.usuarioDAO.pesquisar("login", "Usuario3").get(0));
		Assert.assertEquals(this.usuarioUm, this.usuarioDAO.pesquisarTodos().get(0));
		Assert.assertEquals(this.usuarioDois, this.usuarioDAO.pesquisarTodos().get(1));
		Assert.assertEquals(this.usuarioTres, this.usuarioDAO.pesquisarTodos().get(2));
		this.usuarioDAO.deletar(this.usuarioUm);
		Assert.assertEquals(this.usuarioDois, this.usuarioDAO.pesquisarTodos().get(0));
		Assert.assertEquals(this.usuarioTres, this.usuarioDAO.pesquisarTodos().get(1));
		this.usuarioDAO.deletar(this.usuarioDois);
		Assert.assertEquals(this.usuarioTres, this.usuarioDAO.pesquisarTodos().get(0));
		this.usuarioDAO.deletar(this.usuarioTres);
		Assert.assertEquals(new ArrayList<Usuario>(), this.usuarioDAO.pesquisarTodos());
	}
	
}
